package thread;

import java.util.Scanner;

public class ThreadDemo13 {
    //发现读取内存操作太大,编译器就把读取内存的操作改为读取寄存器
    //此时两个线程一个修改flag,一个读flag会出问题
    //就是内存可见性问题,因为当t1线程flag循环执行没有发生值的改变,jvm就认为这个操作没有必要,就会给flag优化掉,把读取内存操作改为读取寄存器
    //只是会在寄存器中存储,即使其他线程修改了也看不到
    //private static int flag=0;
    //为了防止flag被优化,我们需要加上volatile来关闭jvm的优化,但是会导致系统启动较慢,好处就是防止有些代码被优化
    private static volatile int flag=0;
    public static void main(String[] args) {
        Thread t1=new Thread(()->{
           while (flag==0){

           }
            System.out.println("线程结束");
        });

        Thread t2=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            flag=scanner.nextInt();
        });

        t1.start();
        t2.start();
    }
}
